
import bpy
from bpy.app.handlers import persistent


from 节点更新 import bl_节点全局更新控制面板 as 更新控制面板
from 场景.场景资源管理 import bl_场景管理


import engine.initLIB.load_dll as engineLib
import ctypes







g_上一帧 = -1

def f_帧更新(scene):
	global g_上一帧
	print('ef 0')
	if g_上一帧 == scene.frame_current : return
	#engineLib.flexCAPI.f_场景Update(ctypes.c_int(scene.m_场景ID), ctypes.c_float(1.0), ctypes.c_float(scene.frame_current))
	
	print('ef 01')
	for nt in bpy.data.node_groups:
		print('ef 02:', nt.m_isUpdate)
		if nt.m_isUpdate :
			#if nt.m_是否需要更新被动节点 :
			#	nt.f_重新构建节点()
			#要退出节点更新 = False
			engineLib.flexCAPI.f_node_绑定更新节点树(ctypes.c_wchar_p(nt.name))
			engineLib.flexCAPI.f_node_准备帧更新()
			
			while True:
				更新节点组 = engineLib.flexCAPI.f_更新节点树_begin()
				print('更新节点组 = ', 更新节点组)
				for node in 更新节点组[0]:
					nt.nodes[node].f_update()
					
				if 更新节点组[1] :
					engineLib.flexCAPI.f_更新节点树_end()
					break
	print('ef 03:', g_上一帧)
	#layer = bpy.context.view_layer
	#layer.update()
	

	depsgraph = bpy.context.evaluated_depsgraph_get()
	#depsgraph.updates()
	depsgraph.update()
	scene.update_tag()
	depsgraph.scene.update_tag()
	g_上一帧 = scene.frame_current








@persistent
def f_初始化更新(scene):
	print('mbt ================== scene = ', bpy.data.node_groups)
	bl_场景管理.f_轮询场景(bpy.context.scene)
	#print("Load Handler:", bpy.data.filepath)
	for nt in bpy.data.node_groups:
		nt.f_重新构建节点(True)
		nt.f_定点更新([])
		engineLib.flexCAPI.f_node_初始化更新节点()
	bpy.app.handlers.frame_change_pre.append(f_帧更新)







import functools

#def print_message(message):
#	print("Message:", message)
#bpy.app.timers.register(functools.partialmethod(print_message, "Hello"), first_interval=2.0)
#bpy.app.timers.register(functools.partial(print_message, "Hello"), first_interval=2.0)




def f_节点撤销操作(scene):
	for nt in bpy.data.node_groups:
		print('----------------开始撤销操作----------------')
		if nt.m_父节点树 == None:
			nt.f_重新构建节点(完全重构=True)
		print('----------------结束撤销操作----------------')

def f_节点重做操作(scene):
	for nt in bpy.data.node_groups:
		print('----------------开始重做操作----------------')
		#if nt.m_父节点树 == None:
		#	nt.f_重新构建节点(完全重构=True)
		print('----------------结束重做操作----------------')




def register():
	'''bpy.app.handlers.frame_change_pre.append(f_帧更新)
	#bpy.app.handlers.frame_change_post.append(f_帧更新)
	bpy.app.handlers.render_pre.append(f_帧更新)
	#bpy.app.handlers.render_init.append(f_帧更新)
	#bpy.app.handlers.render_post.append(f_帧更新)
	def f_depsgraph更新(scene):
		print('bpy.app.handlers.depsgraph_update_pre ---------------- ', scene)
	bpy.app.handlers.depsgraph_update_pre.append(f_depsgraph更新)

	bpy.app.handlers.undo_post.append(f_节点撤销操作)
	bpy.app.handlers.redo_post.append(f_节点重做操作)
	print('register bpy.app.handlers.frame_change_pre ********************* :', bpy.app.handlers.frame_change_pre)'''
	更新控制面板.register()

	bpy.app.handlers.load_post.append(f_初始化更新)
	#bpy.app.handlers.load_post.append(f_初始化更新)

	
def unregister():
	更新控制面板.unregister()
	



def f_帧改变更新函数绑定():
	bpy.app.handlers.frame_change_pre.append(f_帧更新)
	print('------f_帧改变更新函数绑定----------')